package  
{
	import flash.display.DisplayObject;
	import flash.display.MovieClip;
	import flash.display.Shape;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.events.ProgressEvent;
	import flash.text.TextField;
	import flash.text.TextFormat;
	import flash.text.TextFormatAlign;
	import flash.utils.getDefinitionByName;
	
	/**
		Предзагрузчик. Не забываем указывать параметр для компиляции -frame start Main.
		В процессе исполнения создаётся ещё один фрейм в который помещается нужный класс.
	 */
	public class Preloader extends MovieClip 
	{
		
		private var shpLogo:Shape;
		private var txtProcess:TextField;
		public function Preloader() 
		{
			if (stage) {
				stage.scaleMode = StageScaleMode.NO_SCALE;
				stage.align = StageAlign.TOP_LEFT;
			}
			addEventListener(Event.ENTER_FRAME, checkFrame);
			loaderInfo.addEventListener(ProgressEvent.PROGRESS, progress);
			loaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioError);
			
			/* Логотип */
			shpLogo = new Shape();
			shpLogo.graphics.beginFill(0xA0F0D2);
			shpLogo.graphics.drawRect(-13, -15, 30, 30);
			shpLogo.graphics.endFill();
			addChild(shpLogo);
			shpLogo.x = stage.stageWidth / 2;
			shpLogo.y = stage.stageHeight / 2; 
			
			/* Текст загрузки */
			var fmtLoading:TextFormat = new TextFormat("_sans", 20, 0xADFAFF, true);
			fmtLoading.align = TextFormatAlign.CENTER;
			txtProcess = new TextField();
			txtProcess.defaultTextFormat = fmtLoading;
			txtProcess.textColor = 0xFFF0F0;
			txtProcess.text = "0";
			
			addChild(txtProcess);
			
			this.stage.frameRate = 15;
			
			// TODO show loader
		}
		
		private function ioError(e:IOErrorEvent):void 
		{
			trace(e.text);
		}
		
		private function progress(e:ProgressEvent):void 
		{
			// TODO update loader
			
			if (txtProcess)
				txtProcess.text = Math.round(e.bytesLoaded / e.bytesTotal * 100).toString() + "%";
		}
		
		private function checkFrame(e:Event):void 
		{
			/* Для теста на локали, ибо слишком быстро */
			
			/* Если данные загружены */
			if (currentFrame == totalFrames) 
			{
				stop();
				loadingFinished();
			}
		}
		
		private function loadingFinished():void 
		{
			removeEventListener(Event.ENTER_FRAME, checkFrame);
			loaderInfo.removeEventListener(ProgressEvent.PROGRESS, progress);
			loaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, ioError);
			
			// TODO hide loader
			
			startup();
		}
		
		private function startup():void 
		{
			stop();
			removeChild(shpLogo);
			removeChild(txtProcess);
			shpLogo = null;
			txtProcess = null;
			
			var mainClass:Class = getDefinitionByName("Main") as Class;
			addChild(new mainClass() as DisplayObject);
		}
		
	}

}